package com.gary.spring.proxy;

import com.gary.spring.entity.CatPO;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashSet;

/**
 * @author peng_rui
 * @date 2022/6/29
 */
public class JdkProxyDemo {

    interface Foo {
        /**
         * foo
         */
        void foo();

        /**
         * foo2
         */
        void foo2();
    }

    static class Target implements Foo {

        @Override
        public void foo() {
            System.out.println("target foo ...");
            foo2();
        }

        @Override
        public void foo2() {
            System.out.println("target foo2 ...");
        }
    }

    public static void main(String[] args) throws Exception {
        Target target = new Target();
        //用于加载在运行期间生成的字节码
        ClassLoader loader = JdkProxyDemo.class.getClassLoader();
        //jdk 动态代理 jdk 的动态代理只能基于接口进行代理
        //第三个参数是InvocationHandler 参数 (代理对象, 被增强的方法， 被增强方法的入参)
        Foo proxy = (Foo) Proxy.newProxyInstance(loader, new Class[]{Foo.class}, (p, method, args1) -> {
            System.out.println("proxy before ...");
            Object invoke = method.invoke(target, args1);
            System.out.println("proxy after ...");
            return invoke;
        });
        System.out.println(proxy.getClass());
        proxy.foo();
        System.in.read();
//        proxy.foo2();
//        HashSet<CatPO> catPOS = new HashSet<>();
//        CatPO cat1 = new CatPO();
//        cat1.setName("花花");
//        cat1.setAge(1);
//        catPOS.add(cat1);
//        CatPO cat2 = new CatPO();
//        cat2.setName("狗蛋");
//        cat2.setAge(2);
//        catPOS.add(cat2);
//
//        System.out.println("cat1 修改前 set中是否能找到：" + catPOS.contains(cat1));
//        cat1.setName("咪咪");
//        System.out.println("cat1 修改后 set中是否能找到：" + catPOS.contains(cat1));
//        for (CatPO catPO : catPOS) {
//            System.out.println(catPO);
//        }
    }
}
